/*
 * porOdcinek.java
 *
 * Created on 26 listopad 2007, 00:10
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package pla;

import odc.Odcinek;

/**
 *
 * @author arkadiusz
 * klasa porownuje dwa odcinki
 */
public class porOdcinek {

  private int p = 80;

  /**
   * Creates a new instance of porOdcinek
   */
  public porOdcinek(int p) {
    this.p = p;
  }

  public boolean estasSmilaj(Odcinek o1, Odcinek o2) {
    //if (o1.len  < 2 || o2.len < 2)
    //jak w ogole na siebie nie zachodza to NIE OK
    if (takieSAME(o1, o2)) {
      return false;
    }
    if (o1.k1 > o2.k2 || o1.k2 < o2.k1) {
      return false;
    }
    //jak zachodza ale sie rozjerzdzaja za bardzo to NIE OK
    double do1 = o1.getLength();
    double do2 = o2.getLength();
    //jezeli dlugosci sa za krotkie to nie sa podobne,
    if (do1 < 0.01 || do2 < 0.01) {
      return false;
    }
    double do12 = o1.razyS(o2);
    // w ma interpretacje cos(kata miedzy: o1,o2). 
    double w = Math.abs(do12 / do1 / do2);
    //czyli jak jest bliski 1.0 to wektory/odcinki sa
    //rownolegle, wiec jak nie sa to NE OK!
    if (w * 100 < this.p) {
      return true;
    }
    //jak ten sam zakres k to OK
    if (o1.k1 == o2.k1 && o1.k2 == o2.k2) {
      return true;
    }

    //czesc wspolna zbiorow
    int wp = Math.max(o1.k1, o2.k1);
    int wk = Math.min(o1.k2, o2.k2);
    double czWsp = wk - wp;
    //suma dwoch zbiorow
    int sp = Math.min(o1.k1, o2.k1);
    int sk = Math.max(o1.k2, o2.k2);
    double sum = sk - sp;

    //jezeli czensc wspulna w stousnku do sumy jest wystarczajaca to OK
    if (czWsp / sum * 100 > this.p) {
      return true;
    }

    return false;

  }

  //wykluczanie odcinkow ZABARDZO podobnych
  private boolean takieSAME(Odcinek o1, Odcinek o2) {

    double r1 =
             (o1.x1 - o2.x1) * (o1.x1 - o2.x1) 
           + (o1.y1 - o2.y1) * (o1.y1 - o2.y1) 
           + (o1.z1 - o2.z1) * (o1.z1 - o2.z1);
    double r2 =
            (o1.x2 - o2.x2) * (o1.x2 - o2.x2) 
          + (o1.y2 - o2.y2) * (o1.y2 - o2.y2) 
          + (o1.z2 - o2.z2) * (o1.z2 - o2.z2);
    
    if(Math.sqrt(r1) < 0.01 && Math.sqrt(r2)<0.01)
      return true;
    return false;
  }
}
